#ifndef __M_LOGGER_H_
#define __M_LOGGER_H_

// #include <iostream>
#include <stdio.h>
#include <time.h>

// 定义日志等级
#define INF 0
#define DBG 1
#define ERR 2
// 默认设置为 DBG 等级, 只有 level >= INF 等级的日志信息才会打印的哦
#define DEFAULT_LOG_LEVEL INF  

// 宏函数
// ... 表示的是不定参数
// #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__);
/*得到相同的当前时间*/
#define LOG(level, format, ...) do{\
    if(level < DEFAULT_LOG_LEVEL) break;\
    time_t t = time(NULL);\
    struct tm *lt = localtime(&t);\
    char buf[32] = {0};\
    strftime(buf, 31, "%H:%M:%S", lt);\
    /*buf 存储的是格式化的时间信息*/\
    fprintf(stdout, "[%s %s:%d] " format "\n", buf, __FILE__, __LINE__,  ##__VA_ARGS__);\
}while(0)

// 加一个 level 的参数
#define ILOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DLOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ELOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

#endif


/*
    测试代码：
    #include "logger.hpp"

    int main(void){
        // fprintf(stdout, "%s-%d\n", "bety", 100);
        // LOG("%s-%d\n", "bety", 100);  // 使用宏函数
        // __VA_ARGS__ 前面添加 ## 使得这一行代码可以正常运行，format 后面添加 "\n" 就有自动换行的功能了
        // LOG("bit");

        // 下面的三条信息都是可以打印的
        ILOG("bit");
        DLOG("it");
        ELOG("t");

        return 0;
    }
*/

